#include "filelist.h"

Head_List * jpg_list;
Head_List * mp3_list;

/*
	Search_Pics:在给定的路径下面去搜索所有的图片文件
		并且创建一个带头节点的双向循环链表来保存图片
		文件的信息。
	@path: 指定的搜索路径
	返回值: 
		成功 返回创建好的图片文件的链表的头节点
		失败 返回NULL
*/
void Search_Pics(const char * path)
{	
	
	//创建一个头节点
	jpg_list = Create_Head();
    mp3_list= Create_Head();
	//打开目录
	DIR * fp = opendir(path); //打开目录文件
	if(fp == NULL)
	{
		perror("filelist opendir error");
		return ;
	}
	//再读取目录项
	struct dirent * dirp = NULL; //dirp用来指向下一个目录项
	while(1)
	{
		//过滤掉 . 和 .. 
		//读取文件的属性
		dirp = readdir(fp);
		if(dirp == NULL)
		{
			//出错啦 || 读完啦
			break;
		}

		//排除 . 和 .. 
		if(strcmp(dirp->d_name , ".") == 0 || strcmp(dirp->d_name , "..") == 0 )            
		{
			continue;
		}

		//整合 d_name文件或者目录的 路径
		char pathname[512] = {0};
		sprintf(pathname, "%s/%s", path, dirp->d_name);
		printf("open fd %s\n", pathname);

		struct stat st; //用来保存文件的属性 
		int ret = stat(pathname, &st ); //获取文件的属性
		if(ret == -1)
		{
			perror("filelist stat error");
			return ;
		}
 
		int flag=0;
		if(S_ISREG(st.st_mode))
		{
			int len=strlen(dirp->d_name);	
			if(strcmp(".jpg",&dirp->d_name[len-4])==0 )   //精髓
				flag=1;                            //jpg标志
			if(flag)
			{
				//创建节点空间，保存图片的信息
				//加入到链表中去
				fNode *pnew = NULL;//指向新创建的结点
				pnew = malloc(sizeof(*pnew));
				strcpy(pnew->filename,dirp->d_name);
				pnew->ftype=PIC_TYPE_JPG;
				pnew->next = NULL;
				jpg_list->NodeNum++;
				printf("\nNum=%d Fnode:%s\n",jpg_list->NodeNum,pnew->filename);
				Add_fNode_To_List(jpg_list, pnew);
				flag=0;
			}
            if(strcmp(".mp3",&dirp->d_name[len-4])==0)
            {
                fNode *pnew = NULL;//指向新创建的结点
				pnew = malloc(sizeof(*pnew));
				strcpy(pnew->filename,dirp->d_name);
				pnew->ftype=PIC_TYPE_MP3;
				pnew->next = NULL;
				mp3_list->NodeNum++;
				printf("\nNum=%d Fnode:%s\n",mp3_list->NodeNum,pnew->filename);
				Add_fNode_To_List(mp3_list, pnew);

            }
			//......
		}
	}
	
	closedir(fp);
}






//创建一个头结点，并且返回其指针 
static Head_List * Create_Head(void)
{
	//struct fNode *pnew = NULL;//指向新创建的结点
	struct Head_List *list = malloc(sizeof(*list));
    list->first = NULL;//指向第一个数据结点
    list->last = NULL;//指向最后一个数据结点
    list->NodeNum = 0;//数据结点的数量
	return list;
}


//添加节点到链表中去
static void *Add_fNode_To_List(Head_List * list, fNode * pnew)
{
	 if(list->first == NULL) // 从无到有，首尾结点都是pnew
	{
		list->first = pnew;
		list->last = pnew;
	}
	else//从少到多
	{
		pnew->prev=list->last;
		list->last->next = pnew; // list->last 指向新结点
		list->last = pnew;//list->last被pnew替代
	}
	if(list->NodeNum != 0)					//	首尾节点相连
	{
		list->last->next = list->first;
		list->first->prev = list->last;
	}
	return list;
}



void Print_List_Msg(Head_List * h)
{

	if(h == NULL || h->NodeNum == 0)
	{
		printf("不存在\n");
		return ;

	}
	fNode *pnew=h->first;
	for(int i=0;i<h->NodeNum;i++)
	{
		printf("Fnode:%s\n",pnew->filename);
		pnew=pnew->next;
	}
}


void destroy_list(Head_List* list)
{
    fNode *pc = list->first; 			// 指向要拆的那个数据结点
    list->last->next = NULL; 			// 先把循环的属性去掉
    int len = list->NodeNum;
    /*拆并释放数据结点*/
    while(len--)
    {
        list->first = list->first->next;
        pc->next = NULL; 				// 工程规范
        free(pc);
        pc = list->first;
    }
    /*释放头结点*/
    list->first = NULL;
    list->last = NULL;
    free(list);
    list = NULL;
}
